package com.lemon.file.service.impl;

import java.util.List;

import cn.hutool.core.collection.CollUtil;
import com.lemon.common.core.constant.Constants;
import com.lemon.common.core.exception.ServiceException;
import com.lemon.common.core.utils.StringUtils;
import com.lemon.common.security.utils.OptEntityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.lemon.file.mapper.BiFileFolderMapper;
import com.lemon.file.domain.BiFileFolder;
import com.lemon.file.service.IBiFileFolderService;

/**
 * 文件夹管理Service业务层处理
 * 
 * @author huangpeng
 * @date 2022-12-18
 */
@Service
public class BiFileFolderServiceImpl implements IBiFileFolderService 
{
    @Autowired
    private BiFileFolderMapper biFileFolderMapper;

    /**
     * 查询文件夹管理
     * 
     * @param id 文件夹管理主键
     * @return 文件夹管理
     */
    @Override
    public BiFileFolder selectBiFileFolderById(Long id)
    {
        return biFileFolderMapper.selectBiFileFolderById(id);
    }

    /**
     * 查询文件夹管理列表
     * 
     * @param biFileFolder 文件夹管理
     * @return 文件夹管理
     */
    @Override
    public List<BiFileFolder> selectBiFileFolderList(BiFileFolder biFileFolder)
    {
        return biFileFolderMapper.selectBiFileFolderList(biFileFolder);
    }

    /**
     * 新增文件夹管理
     * 
     * @param biFileFolder 文件夹管理
     * @return 结果
     */
    @Override
    public int insertBiFileFolder(BiFileFolder biFileFolder)
    {
        // 或取完整的路径编码，和路径名称
        handlePathCodeAndName(biFileFolder);
        // 判断文件夹是否存在
        BiFileFolder temp = new BiFileFolder();
        temp.setPathCode(biFileFolder.getPathCode());
        List<BiFileFolder> existFolder = biFileFolderMapper.selectBiFileFolderList(temp);
        if (CollUtil.isNotEmpty(existFolder)) {
            throw new ServiceException("父文件夹下已存在当前文件夹编码！", null);
        }
        OptEntityUtils.preInsert(biFileFolder);
        return biFileFolderMapper.insertBiFileFolder(biFileFolder);
    }

    /**
     * 修改文件夹管理
     * 
     * @param biFileFolder 文件夹管理
     * @return 结果
     */
    @Override
    public int updateBiFileFolder(BiFileFolder biFileFolder)
    {
        // 或取完整的路径编码，和路径名称
        handlePathCodeAndName(biFileFolder);
        OptEntityUtils.preUpdate(biFileFolder);
        return biFileFolderMapper.updateBiFileFolder(biFileFolder);
    }

    /**
     * 批量删除文件夹管理
     * 
     * @param ids 需要删除的文件夹管理主键
     * @return 结果
     */
    @Override
    public int deleteBiFileFolderByIds(Long[] ids)
    {
        return biFileFolderMapper.deleteBiFileFolderByIds(ids);
    }

    /**
     * 删除文件夹管理信息
     * 
     * @param id 文件夹管理主键
     * @return 结果
     */
    @Override
    public int deleteBiFileFolderById(Long id)
    {
        return biFileFolderMapper.deleteBiFileFolderById(id);
    }

    /**
     * 或取完整的路径编码，和路径名称
     * @Title: handlePathCodeAndName
     * @Description: 或取完整的路径编码，和路径名称
     * @param biFileFolder
     * @return: void
     * @throws:
     * @author: huangpeng
     * @Date: 2022/12/18 19:29
     */
    private void handlePathCodeAndName(BiFileFolder biFileFolder) {
        String pathCode = recurrencePath(biFileFolder, true);
        String pathName = recurrencePath(biFileFolder, false);
        biFileFolder.setPathCode(pathCode);
        biFileFolder.setPathName(pathName);
    }

    /**
     * 递归获取完整文件夹名称，完整文件夹编码
     * @Title: recurrencePath
     * @Description: 递归获取完整文件夹名称，完整文件夹编码
     * @param biFileFolder
     * @param flag true获取完整文件夹编码，false获取完整文件夹名称
     * @return: String
     * @throws:
     * @author: huangpeng
     * @Date: 2022/12/18 19:31
     */
    private String recurrencePath(BiFileFolder biFileFolder, boolean flag) {
        if (StringUtils.isNotEmpty(biFileFolder.getParentCode()) && !Constants.STR_SLASH.equals(biFileFolder.getParentCode())) {
            BiFileFolder parentFolder = biFileFolderMapper.queryByFolderCode(biFileFolder.getParentCode());
            String result = recurrencePath(parentFolder, flag);
            if (flag) {
                return result + "/" + biFileFolder.getFolderCode();
            } else {
                return result + "/" + biFileFolder.getFolderName();
            }
        } else {
            if (flag) {
                return "/" + biFileFolder.getFolderCode();
            } else {
                return "/" + biFileFolder.getFolderName();
            }
        }
    }
}
